#!/usr/bin/env python3
"""
MCP插件增强功能演示示例

本示例演示了MCP插件系统的增强功能：
1. 插件依赖管理
2. 插件版本管理
3. 插件市场集成
"""

import json
import sys
from pathlib import Path

# 添加项目根目录到Python路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))

from src.utils.mcp_plugin_loader import plugin_loader


async def demo_plugin_dependencies():
    """演示插件依赖管理功能"""
    print("=== 插件依赖管理演示 ===")
    
    # 创建一个带依赖的插件配置示例，使用虚构的依赖避免与实际系统冲突
    plugin_config = {
        "server_name": "demo_plugin",
        "version": "1.0.0",
        "enabled": True,
        "url": "http://localhost:8000/demo_plugin",
        "dependencies": ["logging_plugin"]  # 使用虚构的依赖插件
    }
    
    # 为演示目的，我们手动构建一个简单的依赖图
    dependency_graph = {
        "demo_plugin": ["logging_plugin"],
        "logging_plugin": []  # 没有依赖
    }
    
    print(f"插件依赖图: {json.dumps(dependency_graph, indent=2, ensure_ascii=False)}")
    
    # 解析依赖关系
    try:
        sorted_deps = plugin_loader._topological_sort(dependency_graph)
        print(f"拓扑排序结果: {sorted_deps}")
        # 检查demo_plugin是否在最后
        if sorted_deps[-1] == "demo_plugin":
            # 移除当前插件本身（它应该在最后加载）
            sorted_deps.remove("demo_plugin")
            print(f"解析出的依赖顺序: {sorted_deps}")
        else:
            print(f"解析出的依赖顺序: {sorted_deps}")
    except Exception as e:
        print(f"依赖解析失败: {e}")
    
    print()
    
    # 演示循环依赖检测
    print("演示循环依赖检测:")
    circular_dependency_graph = {
        "plugin_a": ["plugin_b"],
        "plugin_b": ["plugin_c"],
        "plugin_c": ["plugin_a"]  # 形成循环依赖
    }
    
    print(f"循环依赖图: {json.dumps(circular_dependency_graph, indent=2, ensure_ascii=False)}")
    
    try:
        sorted_deps = plugin_loader._topological_sort(circular_dependency_graph)
        print(f"拓扑排序结果: {sorted_deps}")
    except Exception as e:
        print(f"循环依赖检测成功: {e}")
    
    print()


def demo_plugin_version_management():
    """演示插件版本管理功能"""
    print("=== 插件版本管理演示 ===")
    
    # 检查版本兼容性
    plugin_name = "test_plugin"
    
    # 模拟版本兼容性检查
    versions_to_check = [
        ("1.0.0", "1.2.0"),   # 实际版本 >= 所需版本，应该兼容
        ("1.2.0", "1.0.0"),   # 实际版本 >= 所需版本，应该兼容
        ("0.9.0", "1.0.0"),   # 实际版本 < 所需版本，应该不兼容
    ]
    
    for required, actual in versions_to_check:
        is_compatible = plugin_loader.check_version_compatibility(plugin_name, required, actual)
        print(f"插件 {plugin_name} 版本要求: {required}, 实际版本: {actual}, 兼容性: {'是' if is_compatible else '否'}")
    
    print()


async def demo_plugin_marketplace():
    """演示插件市场集成功能"""
    print("=== 插件市场集成演示 ===")
    
    # 搜索插件
    print("搜索包含'file'关键词的插件...")
    results = plugin_loader.search_plugins("file")
    print(f"找到 {len(results)} 个匹配的插件")
    for plugin in results:
        print(f"  - {plugin['name']} (版本: {plugin.get('version', 'unknown')})")
    
    print()
    
    # 浏览插件市场（这会尝试连接到实际的插件市场URL）
    print("浏览插件市场...")
    try:
        marketplace_plugins = await plugin_loader.browse_marketplace()
        print(f"插件市场中有 {len(marketplace_plugins)} 个插件")
        for plugin in marketplace_plugins[:3]:  # 只显示前3个
            print(f"  - {plugin.get('name', 'unknown')} (版本: {plugin.get('version', 'unknown')})")
    except Exception as e:
        print(f"浏览插件市场失败: {e}")
        print("注意: 这是预期的，因为我们使用的是示例URL")
    
    print()


async def main():
    """主函数"""
    print("MCP插件增强功能演示")
    print("=" * 50)
    
    # 演示插件依赖管理
    await demo_plugin_dependencies()
    
    # 演示插件版本管理
    demo_plugin_version_management()
    
    # 演示插件市场集成
    await demo_plugin_marketplace()
    
    print("演示完成!")


if __name__ == "__main__":
    import asyncio
    asyncio.run(main())